package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.DateUtil;
import qc.common.core.utils.IdentifierUtil;
import qc.module.ehs.dto.investrecord.InvestRecordDto;
import qc.module.ehs.dto.investrecord.InvestRecordQueryConditionDto;
import qc.module.ehs.entity.EhsInvestRecord;
import qc.module.ehs.mapper.EhsInvestRecordMapper;
import qc.module.ehs.repository.EhsInvestRecordRepository;
import qc.module.platform.dto.uac.UacUserInfoDto;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 安全生产资金投入记录接口Service
 *
 * @author QuCheng Tech
 * @since 2024/10/29
 */
@Service
public class EhsInvestRecordService {

    @Autowired
    private EhsInvestRecordRepository repository;

    /**
     * 查询安全生产资金投入记录
     *
     * @param condition 查询条件DTO
     * @return List<InvestRecordDto>
     * @author QuCheng Tech
     * @since 2024/10/29
     */
    public List<InvestRecordDto> query(InvestRecordQueryConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("查询条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        //查询时间处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(condition.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(condition.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(condition.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(condition.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的截止日期转换错误");
            }
        }

        LambdaQueryWrapper<EhsInvestRecord> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsInvestRecord::getOrgcode, condition.getOrgcode());
        //实际投入起始时间 >= 开始时间 and 实际投入截止时间 <= 结束时间
        if (beginDate != null && endDate != null) {
            Date begintm = beginDate;
            Date endtm = endDate;
            wrapper.and(q -> {
                q.ge(EhsInvestRecord::getBegintm, begintm).le(EhsInvestRecord::getEndtm, endtm);
            });
        }
        if (StringUtils.isNotBlank(condition.getInvesttype())) {
            wrapper.eq(EhsInvestRecord::getInvesttype, condition.getInvesttype());
        }
        if (StringUtils.isNotBlank(condition.getRecordid())) {
            wrapper.eq(EhsInvestRecord::getRecordid, condition.getRecordid());
        }
        if (StringUtils.isNotBlank(condition.getKeywords())) {
            wrapper.and(q -> {
                q.like(EhsInvestRecord::getTitle, condition.getKeywords()).or()
                        .like(EhsInvestRecord::getDescription, condition.getKeywords());
            });
        }

        List<EhsInvestRecord> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsInvestRecordMapper.MAPPER.toDtoList(ens);
        }
        return null;
    }

    /**
     * 获取指定安全生产资金投入记录
     *
     * @param id 安全生产资金投入记录ID
     * @return InvestRecordDto
     * @author QuCheng Tech
     * @since 2024/10/29
     */
    public InvestRecordDto get(String id) {

        EhsInvestRecord en = repository.selectById(id);
        if (Objects.nonNull(en)) {
            return EhsInvestRecordMapper.MAPPER.toDto(en);
        }
        return null;
    }

    /**
     * 新增记录
     *
     * @param dto 新增对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/29
     */
    public String add(InvestRecordDto dto, UacUserInfoDto userInfo) {
        if (dto == null) return QCUnifyReturnValue.Warn("新增对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode())) return QCUnifyReturnValue.Warn("组织代码不能为空");
        if (StringUtils.isBlank(dto.getInvesttype())) return QCUnifyReturnValue.Warn("资金投入类型不能为空");
        if (StringUtils.isBlank(dto.getTitle())) return QCUnifyReturnValue.Warn("资金投入项目名称不能为空");
        if (dto.getInvest() < 0.0f) return QCUnifyReturnValue.Warn("资金投入数值不能小于0");
        if (StringUtils.isBlank(dto.getBegintm())) return QCUnifyReturnValue.Warn("实际投入起始时间不能为空");
        if (StringUtils.isBlank(dto.getEndtm())) return QCUnifyReturnValue.Warn("实际投入截止时间不能为空");

        //日期转换处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(dto.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(dto.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                return QCUnifyReturnValue.Warn("开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(dto.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(dto.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                return QCUnifyReturnValue.Warn("截止日期转换错误");
            }
        }
        dto.setBegintm(null);
        dto.setEndtm(null);

        EhsInvestRecord en = EhsInvestRecordMapper.MAPPER.toEntity(dto);
        en.setId(IdentifierUtil.randomUUID());
        en.setIntm(DateUtil.getNowDate());
        en.setUserid(userInfo.getId());
        en.setUsername(userInfo.getName());
        en.setBegintm(beginDate);
        en.setEndtm(endDate);

        if (repository.insert(en) < 0x1) {
            return QCUnifyReturnValue.Warn("保存失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改记录
     *
     * @param dto 修改对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/29
     */
    public String update(InvestRecordDto dto) {
        if (dto == null) return QCUnifyReturnValue.Warn("新增对象不能为空");
        if (StringUtils.isBlank(dto.getId())) return QCUnifyReturnValue.Warn("ID不能为空");
        if (StringUtils.isBlank(dto.getOrgcode())) return QCUnifyReturnValue.Warn("组织代码不能为空");
        if (StringUtils.isBlank(dto.getInvesttype())) return QCUnifyReturnValue.Warn("资金投入类型不能为空");
        if (StringUtils.isBlank(dto.getTitle())) return QCUnifyReturnValue.Warn("资金投入项目名称不能为空");
        if (dto.getInvest() < 0.0f) return QCUnifyReturnValue.Warn("资金投入数值不能小于0");
        if (StringUtils.isBlank(dto.getBegintm())) return QCUnifyReturnValue.Warn("实际投入起始时间不能为空");
        if (StringUtils.isBlank(dto.getEndtm())) return QCUnifyReturnValue.Warn("实际投入截止时间不能为空");
        if (Objects.isNull(repository.selectById(dto.getId()))) return QCUnifyReturnValue.Warn("修改的记录信息不存在");

        //日期转换处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(dto.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(dto.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                return QCUnifyReturnValue.Warn("开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(dto.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(dto.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                return QCUnifyReturnValue.Warn("截止日期转换错误");
            }
        }
        dto.setBegintm(null);
        dto.setEndtm(null);

        EhsInvestRecord en = EhsInvestRecordMapper.MAPPER.toEntity(dto);
        en.setBegintm(beginDate);
        en.setEndtm(endDate);
        repository.updateById(en);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除记录
     *
     * @param id 记录ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/29
     */
    public String delete(String id) {
        repository.deleteById(id);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 获取指定组织机构下的时间段内的所有资金投入记录集合
     *
     * @param orgCode   组织机构代码
     * @param beginTime 查询开始时间
     * @param endTime   查询结束时间
     * @author QuCheng Tech
     */
    public List<EhsInvestRecord> getAllInvestRecord(String orgCode, Date beginTime, Date endTime) throws QCPromptException {
        if (StringUtils.isBlank(orgCode)) throw new QCPromptException("组织机构代码不能为空");

        LambdaQueryWrapper<EhsInvestRecord> wrapper = new LambdaQueryWrapper<>();
        //组织机构代码，必须有，判断相等
        wrapper.eq(EhsInvestRecord::getOrgcode, orgCode);
        //时间判断
        wrapper.and(q -> {
            (q.ge(EhsInvestRecord::getBegintm, beginTime).le(EhsInvestRecord::getEndtm, endTime)).or()
                    .le(EhsInvestRecord::getBegintm, beginTime).ge(EhsInvestRecord::getEndtm, endTime).or()
                    .le(EhsInvestRecord::getBegintm, endTime).ge(EhsInvestRecord::getEndtm, beginTime);
        });

        return repository.selectList(wrapper);
    }
}
